原始题目:剑指 Offer 28. 对称的二叉树 (opens new window)

解题思路:

判断一棵树是否对称,实际上应该判断树的 左节点 和 右节点 是否互为镜像。

然后判断两颗树 pp, qq 是否互为镜像,首先需要判断各自根节点的值是否相等,然后再递归比较 pp 的左子树是否和 qq 的右子树互为镜像,并且 pp 的右子树也要和 qq 的左子树互为镜像。(互为镜像的意思其实就是对称)

递归函数

终止条件

  1. 如果 ppqq 同时为 nullnull,返回 truetrue
  2. 如果 pp 或者 qq 只有一个为 nullnull ,返回 falsefalse
  3. 如果 p.valq.valp.val \neq q.val ,返回 falsefalse

递归工作

  1. 判断 p.leftp.leftq.rightq.right 是否互为镜像。
  2. 判断 p.rightp.rightq.leftq.left 是否互为镜像。

代码:

public boolean isSymmetric(TreeNode root) {
    if(root == null) {
        return true;
    }
    return isSymmetric(root.left, root.right);
}

private boolean isSymmetric(TreeNode p, TreeNode q) {
    if(p == null && q == null) {
        return true;
    }
    if(p == null || q == null) {
        return false;
    }
    if(p.val != q.val) {
        return false;
    }
    return isSymmetric(p.left, q.right) && isSymmetric(p.right, q.left);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

复杂度分析

  • 时间复杂度O(N)O(N)NN 为树的节点数量,判断对称需要遍历树的所有节点,一次递归判断 22 个节点是否对称,因此最多调用 N/2N/2 次递归函数。

  • 空间复杂度O(N)O(N):最差情况下,树退化成链表,系统使用 O(N)O(N) 大小的递归栈。

树退化为链表

上次更新: 2023/10/15